/* * Sum-product problem (Erich Friedman version) solver */ #include #include #include int sums[17]; int products[81]; int i, j, x, y, p, s, u, v, r, count; void init() { for (i = 0; i < 17; i++) sums[i] = i + 1; for (i = 0; i < 81; i++) { p = i + 1; r = (int)sqrt(p); count = 0; for (u = 1; u <= r; u++) { if (p % u == 0 && u <= 9 && (p/u) <= 9) { count++; } } products[i] = (count > 1) ? p : 0; } } void S_does_not_know() { for (i = 0; i < 17; i++) { s = sums[i]; if (!s) continue; count = 0; for (u = 1; u <= (s/2); u++) { v = s - u; if (u > 9 || v > 9) continue; p = u * v; for (j = 0; j < 81; j++) { if (products[j] == p) count++; } } if(count < 2) sums[i] = 0; } } void P_does_not_know() { for (i = 0; i < 81; i++) { p = products[i]; if (!p) continue; r = (int)sqrt(p); count = 0; for (u = 1; u <= r; u++) { v = p / u; if (u > 9 || v > 9) continue; s = u + v; for (j = 0; j < 18; j++) { if (sums[j] == s) count++; } } if (count < 2) products[i] = 0; } } void P_knows() { for (i = 0; i < 81; i++) { p = products[i]; if (!p) continue; r = (int)sqrt(p); count = 0; for (u = 1; u <= r; u++) { v = p / u; if (u > 9 || v > 9) continue; s = u + v; for (j = 0; j < 18; j++) { if (sums[j] == s) { count++; x = u; y = v; } } } if (count == 1) { printf("The two numbers are %d and %d.\n", x, y); return; } } } int main() { init(); P_does_not_know(); S_does_not_know(); P_does_not_know(); S_does_not_know(); P_does_not_know(); S_does_not_know(); P_does_not_know(); S_does_not_know(); P_knows(); return 0; }